home *** CD-ROM | disk | FTP | other *** search
- /*
- * $Id: ai.trm,v 1.9 1999/01/13 21:49:44 lhecking Exp $
- *
- */
-
- /* GNUPLOT - ai.trm */
-
- /*[
- * Copyright 1991, 1992, 1993, 1998
- *
- * Permission to use, copy, and distribute this software and its
- * documentation for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.
- *
- * Permission to modify the software is granted, but not the right to
- * distribute the complete modified source code. Modifications are to
- * be distributed as patches to the released version. Permission to
- * distribute binaries produced by compiling modified sources is granted,
- * provided you
- * 1. distribute the corresponding source modifications from the
- * released version in the form of a patch file along with the binaries,
- * 2. add special version identification to distinguish your version
- * in addition to the base release version number,
- * 3. provide your name and address as the primary contact for the
- * support of your modified version, and
- * 4. retain our contact information in regard to use of the base
- * software.
- * Permission to distribute the released version of the source code along
- * with corresponding source modifications in the form of a patch file is
- * granted with same provisions 2 through 4 for binary distributions.
- *
- * This software is provided "as is" without express or implied warranty
- * to the extent permitted by applicable law.
- ]*/
-
- /*
- * This file is included by ../term.c.
- *
- * This terminal driver supports:
- * aifm
- *
- * AUTHORS
- * Ray Ghanbari
- *
- * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
- *
- * The 'aifm' driver produces files editable by Adobe Illustrator 3.0
- * To change font to Courier and font size to 20pts use
- * 'set term aifm "Courier" 20'.
- * To switch to color output use
- * 'set term aifm color'.
- */
-
- /* AIFM driver by Ray Ghanbari, ray@mtl.mit.edu,
- * based on PostScript driver by Russell Lang, rjl@monu1.cc.monash.edu.au */
-
- /* Changed to 3.6 terminal format, David C. Schooley, 9/29/95 */
- /* Improved multiple plot support, David C. Schooley, 6/5/95 */
- /* Compatiblity with Illustrator 7.0, David C. Schooley, 6/5/95 */
- /* Font and size support for labels, David C. Schooley, 6/5/95 */
-
- #include "driver.h"
-
- #ifdef TERM_REGISTER
- register_term(aifm)
- #endif
-
- #ifdef TERM_PROTO
- TERM_PUBLIC void AI_init __PROTO((void));
- TERM_PUBLIC void AI_graphics __PROTO((void));
- TERM_PUBLIC void AI_text __PROTO((void));
- TERM_PUBLIC void AI_linetype __PROTO((int linetype));
- TERM_PUBLIC void AI_move __PROTO((unsigned int x, unsigned int y));
- TERM_PUBLIC void AI_vector __PROTO((unsigned int x, unsigned int y));
- TERM_PUBLIC void AI_put_text __PROTO((unsigned int x, unsigned int y, char *str));
- TERM_PUBLIC int AI_text_angle __PROTO((int ang));
- TERM_PUBLIC void AI_reset __PROTO((void));
- TERM_PUBLIC void AI_options __PROTO((void));
- TERM_PUBLIC int AI_justify_text __PROTO((enum JUSTIFY mode));
- TERM_PUBLIC void AI_suspend __PROTO(());
- TERM_PUBLIC void AI_resume __PROTO(());
- TERM_PUBLIC int AI_set_font __PROTO((char *font));
-
- #define AI_XOFF 50 /* page offset in pts */
- #define AI_YOFF 50
-
- #define AI_XMAX 5000
- #define AI_YMAX 3500
-
- #define AI_XLAST (AI_XMAX - 1)
- #define AI_YLAST (AI_YMAX - 1)
-
- #define AI_VTIC (AI_YMAX/80)
- #define AI_HTIC (AI_YMAX/80)
-
- #define AI_SC (10.0) /* scale is 1pt = 10 units */
- #define AI_LW (0.5*AI_SC) /* linewidth = 0.5 pts */
-
- #define AI_VCHAR (14*AI_SC) /* default is 14 point characters */
- #define AI_HCHAR (14*AI_SC*6/10)
-
- #endif
-
-
-
- #ifndef TERM_PROTO_ONLY
- #ifdef TERM_BODY
-
- /* From version.c */
- extern char version[];
- extern char patchlevel[];
-
- char ai_font[MAX_ID_LEN + 1] = "Times-Roman"; /* name of font */
- int ai_fontsize = 14; /* size of font in pts */
- char ai_oldfont[MAX_ID_LEN + 1] = "Times-Roman"; /* name of font */
- int ai_oldfontsize = 14; /* size of font in pts */
- TBOOLEAN ai_color = FALSE;
- TBOOLEAN ai_stroke = FALSE;
- int ai_page = 0; /* page count */
- int ai_path_count = 0; /* count of lines in path */
- int ai_ang = 0; /* text angle */
- int ai_subgroup_level = 0; /* depth of sub-groups */
- int ai_multiplot_group = 0; /* group for multiplot */
- enum JUSTIFY ai_justify = LEFT; /* text is flush left */
-
-
- TERM_PUBLIC void AI_options()
- {
- if (!END_OF_COMMAND) {
- if (almost_equals(c_token, "d$efault")) {
- ai_color = FALSE;
- strcpy(ai_font, "Times-Roman");
- ai_fontsize = 14;
- strcpy(ai_oldfont, "Times-Roman");
- ai_oldfontsize = 14;
- c_token++;
- }
- }
- if (!END_OF_COMMAND) {
- if (almost_equals(c_token, "m$onochrome")) {
- ai_color = FALSE;
- c_token++;
- } else if (almost_equals(c_token, "c$olor")
- || almost_equals(c_token, "c$olour")) {
- ai_color = TRUE;
- c_token++;
- }
- }
- if (!END_OF_COMMAND && isstring(c_token)) {
- quote_str(ai_font, c_token, MAX_ID_LEN);
- strcpy(ai_oldfont, ai_font);
- c_token++;
- }
- if (!END_OF_COMMAND) {
- /* We have font size specified */
- struct value a;
- ai_fontsize = (int) real(const_express(&a));
- ai_oldfontsize = ai_fontsize;
- c_token++;
- term->v_char = (unsigned int) (ai_fontsize * AI_SC);
- term->h_char = (unsigned int) (ai_fontsize * AI_SC * 6 / 10);
- }
- sprintf(term_options, "%s \"%s\" %d",
- ai_color ? "color" : "monochrome", ai_font, ai_fontsize);
- }
-
-
- TERM_PUBLIC void AI_init()
- {
- ai_page = 0;
-
- fprintf(gpoutfile, "%%!PS-Adobe-2.0 EPSF-1.2\n\
- %%%%Creator: Adobe Illustrator(TM) 3.2\n\
- %%%%TrueCreator: gnuplot %s patchlevel %s ai terminal\n\
- %%%%BoundingBox: %d %d %d %d\n\
- %%%%Template:\n\
- %%%%EndComments\n\
- %%%%EndProlog\n",
- version, patchlevel,
- AI_XOFF, AI_YOFF,
- (int) ((AI_XMAX) / AI_SC + 0.5 + AI_XOFF),
- (int) ((AI_YMAX) / AI_SC + 0.5 + AI_YOFF));
- }
-
-
- TERM_PUBLIC void AI_graphics()
- {
- ai_page++;
- /* fprintf(gpoutfile,"%%%%Page: %d %d\n",ai_page,ai_page);*/
- fputs("\
- 0 G\n\
- 1 j\n\
- 1 J\n\
- u\n", gpoutfile);
- ai_path_count = 0;
- ai_stroke = FALSE;
- }
-
-
- TERM_PUBLIC void AI_text()
- {
- if (ai_stroke) {
- fputs("S\n", gpoutfile);
- ai_stroke = FALSE;
- }
- while (ai_subgroup_level) {
- fputs("U\n", gpoutfile);
- ai_subgroup_level--;
- }
- fputs("U\n", gpoutfile);
- ai_path_count = 0;
- ai_multiplot_group = 0;
- }
-
-
- TERM_PUBLIC void AI_reset()
- {
- fputs("%%%%Trailer\n", gpoutfile);
- /* fprintf(gpoutfile,"%%%%Pages: %d\n",ai_page);*/
- }
-
-
- TERM_PUBLIC void AI_linetype(linetype)
- int linetype;
- {
- if (ai_stroke) {
- fputs("S\n", gpoutfile);
- ai_stroke = FALSE;
- }
- if (ai_subgroup_level) {
- fputs("U\n", gpoutfile);
- ai_subgroup_level--;
- }
- if (linetype == -2 && multiplot) {
- /* for each new plot, line_type gets called twice with a value of -2.
- It gets called once for the border and again for the tics.
- This code will need to be changed if gnuplot's behavior changes.
- */
- switch (ai_multiplot_group) {
- case 0:
- fputs("u\n", gpoutfile);
- ai_subgroup_level++;
- ai_multiplot_group = 1;
- break;
- case 1:
- ai_multiplot_group = 2;
- break;
- case 2:
- ai_multiplot_group = 1;
- fputs("U\nu\n", gpoutfile);
- break;
- }
- }
- if (linetype == -2 && !multiplot) {
- if (ai_multiplot_group) {
- fputs("U\n", gpoutfile);
- ai_subgroup_level--;
- ai_multiplot_group = 0;
- }
- }
- fputs("u\n", gpoutfile);
- ai_subgroup_level++;
-
- switch (linetype) {
- case -2:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC * 2.0);
- if (ai_color) {
- fputs("0 0 0 1 K\n", gpoutfile);
- } else {
- fputs("[] 0 d\n", gpoutfile);
- }
- break;
-
- case -1:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC / 2.0);
- if (ai_color) {
- fputs("0 0 0 1 K\n", gpoutfile);
- } else {
- fputs("[1 2] 0 d\n", gpoutfile);
- }
- break;
-
- case 0:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("1 0 1 0 K\n", gpoutfile);
- } else {
- fputs("[] 0 d\n", gpoutfile);
- }
- break;
-
- case 1:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("1 1 0 0 K\n", gpoutfile);
- } else {
- fputs("[4 2] 0 d\n", gpoutfile);
- }
- break;
-
- case 2:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("0 1 1 0 K\n", gpoutfile);
- } else {
- fputs("[2 3] 0 d\n", gpoutfile);
- }
- break;
-
- case 3:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("0 1 0 0 K\n", gpoutfile);
- } else {
- fputs("[1 1.5] 0 d\n", gpoutfile);
- }
- break;
-
- case 4:
- fprintf(gpoutfile, "%f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("1 0 0 0 K\n", gpoutfile);
- } else {
- fputs("[5 2 1 2] 0 d\n", gpoutfile);
- }
- break;
-
- case 5:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("0 0 1 0 K\n", gpoutfile);
- } else {
- fputs("[4 3 1 3] 0 d\n", gpoutfile);
- }
- break;
-
- case 6:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("0 0 0 1 K\n", gpoutfile);
- } else {
- fputs("[2 2 2 4] 0 d\n", gpoutfile);
- }
- break;
-
- case 7:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("0 0.7 1 0 K\n", gpoutfile);
- } else {
- fputs("[2 2 2 2 2 4] 0 d\n", gpoutfile);
- }
- break;
-
- case 8:
- fprintf(gpoutfile, "%.2f w\n", AI_LW / AI_SC);
- if (ai_color) {
- fputs("0.5 0.5 0.5 0 K\n", gpoutfile);
- } else {
- fputs("[2 2 2 2 2 2 2 4] 0 d\n", gpoutfile);
- }
- break;
- }
-
- ai_path_count = 0;
- }
-
-
- TERM_PUBLIC void AI_move(x, y)
- unsigned int x, y;
- {
- if (ai_stroke)
- fputs("S\n", gpoutfile);
- fprintf(gpoutfile, "%.2f %.2f m\n", x / AI_SC, y / AI_SC);
- ai_path_count += 1;
- ai_stroke = TRUE;
- }
-
-
- TERM_PUBLIC void AI_vector(x, y)
- unsigned int x, y;
- {
- fprintf(gpoutfile, "%.2f %.2f l\n", x / AI_SC, y / AI_SC);
- ai_path_count += 1;
- ai_stroke = TRUE;
- if (ai_path_count >= 400) {
- fprintf(gpoutfile, "S\n%.2f %.2f m\n", x / AI_SC, y / AI_SC);
- ai_path_count = 0;
- }
- }
-
-
- TERM_PUBLIC void AI_put_text(x, y, str)
- unsigned int x, y;
- char *str;
- {
- char ch;
- if (ai_stroke) {
- fputs("S\n", gpoutfile);
- ai_stroke = FALSE;
- }
- switch (ai_justify) {
- case LEFT:
- fprintf(gpoutfile, "/_%s %d 0 0 0 z\n", ai_font, ai_fontsize);
- break;
- case CENTRE:
- fprintf(gpoutfile, "/_%s %d 0 0 1 z\n", ai_font, ai_fontsize);
- break;
- case RIGHT:
- fprintf(gpoutfile, "/_%s %d 0 0 2 z\n", ai_font, ai_fontsize);
- break;
- }
- if (ai_ang == 0) {
- fprintf(gpoutfile, "[ 1 0 0 1 %.2f %.2f] e\n",
- x / AI_SC, y / AI_SC - ai_fontsize / 3.0);
- } else {
- fprintf(gpoutfile, "[ 0 1 -1 0 %.2f %.2f] e\n",
- x / AI_SC - ai_fontsize / 3.0, y / AI_SC);
- }
-
- putc('(', gpoutfile);
- ch = *str++;
- while (ch != '\0') {
- if ((ch == '(') || (ch == ')') || (ch == '\\'))
- putc('\\', gpoutfile);
- putc(ch, gpoutfile);
- ch = *str++;
- }
- fputs(") t\nT\n", gpoutfile);
- ai_path_count = 0;
- }
-
- TERM_PUBLIC int AI_text_angle(ang)
- int ang;
- {
- ai_ang = ang;
- return TRUE;
- }
-
- TERM_PUBLIC int AI_justify_text(mode)
- enum JUSTIFY mode;
- {
- ai_justify = mode;
- return TRUE;
- }
-
- TERM_PUBLIC int AI_set_font(font) /* Entry font added by DJL */
- char *font;
- {
- char name[32];
- int size, sep;
-
- if (font && *font) {
- sep = strcspn(font, ",");
- strncpy(name, font, sep);
- name[sep] = '\0';
- size = ai_fontsize;
- sscanf(&(font[sep + 1]), "%d", &size);
- if (*name)
- strcpy(ai_font, name);
- if (size)
- ai_fontsize = size;
- } else {
- ai_fontsize = ai_oldfontsize;
- strcpy(ai_font, ai_oldfont);
- }
- return TRUE;
- }
-
-
- TERM_PUBLIC void AI_suspend()
- {
- }
-
- TERM_PUBLIC void AI_resume()
- {
- }
-
-
- #endif
-
-
- #ifdef TERM_TABLE
-
- TERM_TABLE_START(aifm_driver)
- "aifm", "Adobe Illustrator 3.0 Format",
- AI_XMAX, AI_YMAX, AI_VCHAR, AI_HCHAR,
- AI_VTIC, AI_HTIC, AI_options, AI_init, AI_reset,
- AI_text, null_scale, AI_graphics, AI_move, AI_vector,
- AI_linetype, AI_put_text, AI_text_angle,
- AI_justify_text, do_point, do_arrow, AI_set_font,
- NULL, 0, AI_suspend, AI_resume
- TERM_TABLE_END(aifm_driver)
-
- #undef LAST_TERM
- #define LAST_TERM aifm_driver
-
- #endif /* TERM_TABLE */
- #endif /* TERM_PROTO_ONLY */
-
- #ifdef TERM_HELP
- START_HELP(aifm)
- "1 aifm",
- "?commands set terminal aifm",
- "?set terminal aifm",
- "?set term aifm",
- "?terminal aifm",
- "?term aifm",
- "?aifm",
- " Several options may be set in `aifm`---the Adobe Illustrator 3.0+ driver.",
- "",
- " Syntax:",
- " set terminal aifm {<color>} {\"<fontname>\"} {<fontsize>}",
- "",
- " <color> is either `color` or `monochrome`; \"<fontname>\" is the name of a",
- " valid PostScript font; <fontsize> is the size of the font in PostScript",
- " points, before scaling by the `set size` command. Selecting `default` sets",
- " all options to their default values: `monochrome`, \"Helvetica\", and 14pt.",
- "",
- " Since AI does not really support multiple pages, multiple graphs will be",
- " drawn directly on top of one another. However, each graph will be grouped",
- " individually, making it easy to separate them inside AI (just pick them up",
- " and move them).",
- "",
- " Examples:",
- " set term aifm",
- " set term aifm 22",
- " set size 0.7,1.4; set term aifm color \"Times-Roman\" 14"
- END_HELP(ai)
- #endif /* TERM_HELP */
-